home *** CD-ROM | disk | FTP | other *** search
- unit FrmEnumDisplay;
-
- interface
-
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- ComCtrls, StdCtrls;
-
- type
- TForm1 = class(TForm)
- Modes: TListView;
- Label1: TLabel;
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure ModesDblClick(Sender: TObject);
- private
- { Private declarations }
- CurMode: TDeviceMode;
- procedure GetDisplayModes;
- function SameMode (Mode1, Mode2: TDeviceMode): Boolean;
- public
- { Public declarations }
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- {$R *.DFM}
-
- function TForm1.SameMode (Mode1, Mode2: TDeviceMode): Boolean;
- begin
- Result := (Mode1.dmPelsWidth = Mode2.dmPelsWidth) and
- (Mode1.dmPelsHeight = Mode2.dmPelsHeight) and
- (Mode1.dmBitsPerPel = Mode2.dmBitsPerPel) and
- (Mode1.dmDisplayFrequency = Mode2.dmDisplayFrequency);
- end;
-
- procedure TForm1.GetDisplayModes;
- var
- Idx: Integer;
- DevMode: TDeviceMode;
- PMode: PDeviceMode;
- Item: TListItem;
- begin
- Idx := 0;
- while EnumDisplaySettings (Nil, Idx, DevMode) do begin
- New (PMode);
- PMode^ := DevMode;
- Item := Modes.Items.Add;
- Item.Data := PMode;
- Item.Caption := Format ('%d * %d', [DevMode.dmPelsWidth, DevMode.dmPelsHeight]);
- Item.SubItems.Add (IntToStr (DevMode.dmBitsPerPel));
- if not (DevMode.dmDisplayFrequency in [0, 1]) then
- Item.SubItems.Add (IntToStr (DevMode.dmDisplayFrequency) + ' Hz')
- else
- Item.SubItems.Add ('- device default -');
-
- if SameMode (DevMode, CurMode) then Modes.Selected := Item;
- Inc (Idx);
- end;
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- const
- Enum_Current_Settings = $FFFFFFFE;
- begin
- EnumDisplaySettings (0, Enum_Current_Settings, CurMode);
- GetDisplayModes;
- end;
-
- procedure TForm1.FormDestroy(Sender: TObject);
- var
- Idx: Integer;
- begin
- // Trash the mode list
- for Idx := 0 to Modes.Items.Count - 1 do
- Dispose (PDeviceMode (Modes.Items [Idx].Data));
- end;
-
- procedure TForm1.ModesDblClick(Sender: TObject);
- var
- Item: TListItem;
- ModeStr: String;
- NewMode: TDeviceMode;
- DevMode: PDeviceMode;
- begin
- Item := Modes.Selected;
- if Item <> Nil then begin
- DevMode := Item.Data;
- with DevMode^ do begin
- ModeStr := Format ('Switch display mode to %d * %d, (%d bpp', [dmPelsWidth, dmPelsHeight, dmBitsPerPel]);
- if not (dmDisplayFrequency in [0, 1]) then ModeStr := ModeStr + Format (', %d Hz refresh', [dmDisplayFrequency]);
- if MessageDlg (ModeStr + ') ?', mtConfirmation, mbOKCancel, 0) = mrOK then begin
- NewMode := DevMode^;
- NewMode.dmFields := dm_PelsWidth or dm_PelsHeight or dm_BitsPerPel;
- if not (dmDisplayFrequency in [0, 1]) then NewMode.dmFields := NewMode.dmFields or DM_DisplayFrequency;
- case ChangeDisplaySettings (NewMode, cds_UpdateRegistry) of
-
- Disp_Change_Successful:
- begin
- ShowMessage ('The display mode has successfully been changed');
- Modes.Selected := Item;
- end;
-
- Disp_Change_Restart:
- if MessageDlg ('Need to reboot for display mode change to take effect. Do it now?', mtConfirmation, mbOKCancel, 0) = mrOK then
- ExitWindowsEx (ewx_Reboot, 0);
-
- Disp_Change_BadMode,
- Disp_Change_Failed:
- ShowMessage ('Trouble at ''mill - display mode change failed or not supported');
- end;
- end;
- end;
- end;
- end;
-
- end.
-